library(ggplot2)
library(plotly)
library(gapminder)
library(dplyr)
## install.packages("tidytuesdayR")
tuesdata <- tidytuesdayR::tt_load(2023, week = 42)
--- Compiling #TidyTuesday Information for 2023-10-17 ----
--- There are 3 files available ---
--- Starting Download ---

    Downloading file 1 of 3: `taylor_album_songs.csv`
    Downloading file 2 of 3: `taylor_all_songs.csv`
    Downloading file 3 of 3: `taylor_albums.csv`
--- Download complete ---
taylor_album_songs <- tuesdata$taylor_album_songs
# Add a new column with color
album_name = unique(taylor_album_songs$album_name)
mycolors = c("#b9d2b5", # Taylor Swift
             "#f4cb8d", # Fearless
             "#d1b2d2", # Speak Now
             "#823549", # Red
             "#b5e9f6", # 1989
             "#847e80", # reputation
             "#f9b2d0", # Lover
             "#cfcac6", # folklore
             "#c8ae95", # evermore
             "#434961"  # Midnights
)

color_data = data.frame (album_name, color = mycolors)

taylor_album_songs = taylor_album_songs %>% left_join(color_data, by = "album_name")

data = taylor_album_songs %>%
  select(album_name, color, track_name, valence, energy)
custom_order = c("Taylor Swift", "Fearless (Taylor's Version)", "Speak Now", "Red (Taylor's Version)", "1989", "reputation", "Lover", "folklore", "evermore", "Midnights")
data$album_name = factor(data$album_name, levels = custom_order)

fig = plot_ly(data = data, x = ~energy, y = ~valence,
               color =~album_name,
               colors=mycolors,
               marker = list(size = 10),
               hovertemplate = ~paste("Track Name: ", track_name,
                             "<br>Album: ", album_name,
                             "<br>Energy: ", energy,
                             "<br>Valence: ", valence,
                             '<extra></extra>')
)

# Create text annotation
text_annotation <- list(
  x = 1.4,  # X-coordinate where you want to place the text
  y = -.2, # Y-coordinate where you want to place the text (below the plot)
  text = "<i><b>Valence</b> is musical positiveness conveyed by a track. <br>Tracks with high valence sound more positive (happy, cheerful).<br><b>Energy</b> represents represents a perceptual measure of intensity and activity.</i>",
  showarrow = FALSE,
  xref = "paper",  # x-coordinate reference is the entire plot area
  yref = "paper",  # y-coordinate reference is the entire plot area
  align = "right"
)

m <- list(
  l = 50,
  r = 50,
  b = 150,
  t = 50,
  pad = 1
)

yaxis = list(
  title = 'Spotify Valence Score (0.0 to 1.0)',
  automargin = TRUE,
  titlefont = list(size=16)
)

xaxis = list(
  title = 'Spotify Energy Score (0.0 to 1.0)',
  automargin = TRUE,
  titlefont = list(size=16)
)

fig = fig %>% layout(title = 'Taylor Swift Songs: Energy and Valence', 
                     plot_bgcolor = "#ffffff", 
                     autosize = F,
                     width = 800,
                     height = 800,
                     margin = m,
                     xaxis = xaxis, 
                     yaxis = yaxis, 
                     legend = list(title=list(text='Album')),
                     annotations = text_annotation,
                     font = list(family = "Courier New",
                                 size = 12))
Warning: Specifying width/height in layout() is now deprecated.
Please specify in ggplotly() or plot_ly()
fig
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
Warning: Ignoring 3 observationsNo trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
Warning: Ignoring 3 observations
LS0tCnRpdGxlOiAnVGF5bG9yIFN3aWZ0IFNvbmdzOiBFbmVyZ3kgYW5kIFZhbGVuY2UnCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQpgYGB7ciBsaWJyYXJ5fQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdhcG1pbmRlcikKbGlicmFyeShkcGx5cikKYGBgCgpgYGB7cn0KIyMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXR1ZXNkYXlSIikKdHVlc2RhdGEgPC0gdGlkeXR1ZXNkYXlSOjp0dF9sb2FkKDIwMjMsIHdlZWsgPSA0MikKdGF5bG9yX2FsYnVtX3NvbmdzIDwtIHR1ZXNkYXRhJHRheWxvcl9hbGJ1bV9zb25ncwpgYGAKCmBgYHtyfQojIEFkZCBhIG5ldyBjb2x1bW4gd2l0aCBjb2xvcgphbGJ1bV9uYW1lID0gdW5pcXVlKHRheWxvcl9hbGJ1bV9zb25ncyRhbGJ1bV9uYW1lKQpteWNvbG9ycyA9IGMoIiNiOWQyYjUiLCAjIFRheWxvciBTd2lmdAogICAgICAgICAgICAgIiNmNGNiOGQiLCAjIEZlYXJsZXNzCiAgICAgICAgICAgICAiI2QxYjJkMiIsICMgU3BlYWsgTm93CiAgICAgICAgICAgICAiIzgyMzU0OSIsICMgUmVkCiAgICAgICAgICAgICAiI2I1ZTlmNiIsICMgMTk4OQogICAgICAgICAgICAgIiM4NDdlODAiLCAjIHJlcHV0YXRpb24KICAgICAgICAgICAgICIjZjliMmQwIiwgIyBMb3ZlcgogICAgICAgICAgICAgIiNjZmNhYzYiLCAjIGZvbGtsb3JlCiAgICAgICAgICAgICAiI2M4YWU5NSIsICMgZXZlcm1vcmUKICAgICAgICAgICAgICIjNDM0OTYxIiAgIyBNaWRuaWdodHMKKQoKY29sb3JfZGF0YSA9IGRhdGEuZnJhbWUgKGFsYnVtX25hbWUsIGNvbG9yID0gbXljb2xvcnMpCgp0YXlsb3JfYWxidW1fc29uZ3MgPSB0YXlsb3JfYWxidW1fc29uZ3MgJT4lIGxlZnRfam9pbihjb2xvcl9kYXRhLCBieSA9ICJhbGJ1bV9uYW1lIikKCmRhdGEgPSB0YXlsb3JfYWxidW1fc29uZ3MgJT4lCiAgc2VsZWN0KGFsYnVtX25hbWUsIGNvbG9yLCB0cmFja19uYW1lLCB2YWxlbmNlLCBlbmVyZ3kpCgpgYGAKCmBgYHtyfQpjdXN0b21fb3JkZXIgPSBjKCJUYXlsb3IgU3dpZnQiLCAiRmVhcmxlc3MgKFRheWxvcidzIFZlcnNpb24pIiwgIlNwZWFrIE5vdyIsICJSZWQgKFRheWxvcidzIFZlcnNpb24pIiwgIjE5ODkiLCAicmVwdXRhdGlvbiIsICJMb3ZlciIsICJmb2xrbG9yZSIsICJldmVybW9yZSIsICJNaWRuaWdodHMiKQpkYXRhJGFsYnVtX25hbWUgPSBmYWN0b3IoZGF0YSRhbGJ1bV9uYW1lLCBsZXZlbHMgPSBjdXN0b21fb3JkZXIpCgpmaWcgPSBwbG90X2x5KGRhdGEgPSBkYXRhLCB4ID0gfmVuZXJneSwgeSA9IH52YWxlbmNlLAogICAgICAgICAgICAgICBjb2xvciA9fmFsYnVtX25hbWUsCiAgICAgICAgICAgICAgIGNvbG9ycz1teWNvbG9ycywKICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMTApLAogICAgICAgICAgICAgICBob3ZlcnRlbXBsYXRlID0gfnBhc3RlKCJUcmFjayBOYW1lOiAiLCB0cmFja19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+QWxidW06ICIsIGFsYnVtX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5FbmVyZ3k6ICIsIGVuZXJneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlZhbGVuY2U6ICIsIHZhbGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxleHRyYT48L2V4dHJhPicpCikKCiMgQ3JlYXRlIHRleHQgYW5ub3RhdGlvbgp0ZXh0X2Fubm90YXRpb24gPC0gbGlzdCgKICB4ID0gMS40LCAgIyBYLWNvb3JkaW5hdGUgd2hlcmUgeW91IHdhbnQgdG8gcGxhY2UgdGhlIHRleHQKICB5ID0gLS4yLCAjIFktY29vcmRpbmF0ZSB3aGVyZSB5b3Ugd2FudCB0byBwbGFjZSB0aGUgdGV4dCAoYmVsb3cgdGhlIHBsb3QpCiAgdGV4dCA9ICI8aT48Yj5WYWxlbmNlPC9iPiBpcyBtdXNpY2FsIHBvc2l0aXZlbmVzcyBjb252ZXllZCBieSBhIHRyYWNrLiA8YnI+VHJhY2tzIHdpdGggaGlnaCB2YWxlbmNlIHNvdW5kIG1vcmUgcG9zaXRpdmUgKGhhcHB5LCBjaGVlcmZ1bCkuPGJyPjxiPkVuZXJneTwvYj4gcmVwcmVzZW50cyByZXByZXNlbnRzIGEgcGVyY2VwdHVhbCBtZWFzdXJlIG9mIGludGVuc2l0eSBhbmQgYWN0aXZpdHkuPC9pPiIsCiAgc2hvd2Fycm93ID0gRkFMU0UsCiAgeHJlZiA9ICJwYXBlciIsICAjIHgtY29vcmRpbmF0ZSByZWZlcmVuY2UgaXMgdGhlIGVudGlyZSBwbG90IGFyZWEKICB5cmVmID0gInBhcGVyIiwgICMgeS1jb29yZGluYXRlIHJlZmVyZW5jZSBpcyB0aGUgZW50aXJlIHBsb3QgYXJlYQogIGFsaWduID0gInJpZ2h0IgopCgptIDwtIGxpc3QoCiAgbCA9IDUwLAogIHIgPSA1MCwKICBiID0gMTUwLAogIHQgPSA1MCwKICBwYWQgPSAxCikKCnlheGlzID0gbGlzdCgKICB0aXRsZSA9ICdTcG90aWZ5IFZhbGVuY2UgU2NvcmUgKDAuMCB0byAxLjApJywKICBhdXRvbWFyZ2luID0gVFJVRSwKICB0aXRsZWZvbnQgPSBsaXN0KHNpemU9MTYpCikKCnhheGlzID0gbGlzdCgKICB0aXRsZSA9ICdTcG90aWZ5IEVuZXJneSBTY29yZSAoMC4wIHRvIDEuMCknLAogIGF1dG9tYXJnaW4gPSBUUlVFLAogIHRpdGxlZm9udCA9IGxpc3Qoc2l6ZT0xNikKKQoKZmlnID0gZmlnICU+JSBsYXlvdXQodGl0bGUgPSAnVGF5bG9yIFN3aWZ0IFNvbmdzOiBFbmVyZ3kgYW5kIFZhbGVuY2UnLCAKICAgICAgICAgICAgICAgICAgICAgcGxvdF9iZ2NvbG9yID0gIiNmZmZmZmYiLCAKICAgICAgICAgICAgICAgICAgICAgYXV0b3NpemUgPSBGLAogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDgwMCwKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gODAwLAogICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtLAogICAgICAgICAgICAgICAgICAgICB4YXhpcyA9IHhheGlzLCAKICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSB5YXhpcywgCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9IGxpc3QodGl0bGU9bGlzdCh0ZXh0PSdBbGJ1bScpKSwKICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSB0ZXh0X2Fubm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJDb3VyaWVyIE5ldyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxMikpCmZpZwoKYGBgCgo=